use std::{net::SocketAddr, sync::OnceLock};

use serde::Deserialize;
use tools::global_defin::config::load_config;

///sip的配置文件相关
#[derive(Debug, Deserialize)]
pub struct SipConfig {
	///用来监听isp的地址,此地址可以与外部地址相同
	pub listen_isp_addr: SocketAddr,
	///isp的地址,用此来判断呼入与呼出是否来自isp
	pub isp_addr: SocketAddr,
	///用来监听外部呼叫的地址
	pub listen_external_addr: SocketAddr,
	///对应发送消息当中的allow字段
	pub allow: &'static str,
	///对应发送消息当中的supported字段
	pub supported: &'static str,
	///对应发送消息当中的session_expires字段
	pub session_expires: &'static str,
	///对应发送消息当中的min_se字段
	pub min_se: &'static str,
	///对应发送消息当中allow_events字段
	pub allow_events: &'static str,
	pub domain: &'static str,
	#[serde(default = "defalut_ptime")]
	pub ptime: u16,
}

/**
 * 读sip的配置文件
 */
#[inline]
pub fn sip_config() -> &'static SipConfig {
	static CONFIG: OnceLock<SipConfig> = OnceLock::new();
	// 尝试获取或初始化配置信息
	CONFIG.get_or_init(|| load_config("./config/sip.json"))
}

fn defalut_ptime() -> u16 {
	20
}
